package Vista;

import java.awt.BorderLayout;

import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import javax.swing.JLabel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTextField;
import java.awt.Dimension;
import java.util.Vector;

import javax.swing.JComboBox;
import javax.swing.SwingConstants;
import javax.swing.JButton;
import javax.swing.JTable;

import Controlador.Controlador;
import Modelo.Conexion;
import Modelo.InterfazBD;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JScrollPane;

public class Panel_MCliente_Concesionario extends JPanel {

	// ATRIBUTOS
	private Controlador control;
	private InterfazBD interfazBD;
	private Dialogo_Imagen dialogImagen;
	// Paneles
	private JPanel panelPrin;
	private JPanel panelMarca;
	private JPanel panelMarcaSup;
	private JPanel panelMarcaCentro;
	private JPanel panelModelo;
	private JPanel panelModeloSup;
	private JPanel panelModeloCentro;
	private JPanel panelCombus;
	private JPanel panelCombusSup;
	private JPanel panelCombusCentro;
	private JPanel panelCV;
	private JPanel panelCVSup;
	private JPanel panelCVCentro;
	private JPanel panelInfBotones;

	// Etiquetas
	private JLabel labelMarca;
	private JLabel labelModelo;
	private JLabel labelCombus;
	private JLabel labelCV;

	// Campo texto
	private JComboBox comboCV;

	// Botones
	private JButton botonComprar;
	private JComboBox comboMarca;
	private JComboBox comboModelo;
	private JComboBox comboCombus;

	// Colores
	private Color rojoOscuro;
	private Color rojoClaro;
	private JButton botonVistaPrevia;
	private JScrollPane scrollPaneTablaDescripcion;
	private JTable tablaDescripcion;

	/**
	 * Create the panel.
	 */
	public Panel_MCliente_Concesionario(Controlador control) {
		this.control = control;

		// INSTANCIAR COLORES
		rojoOscuro = new Color(139, 0, 0);
		rojoClaro = new Color(255, 182, 193);

		// INSTANCIAR PANELES
		// panelPrin
		panelPrin = new JPanel();
		this.setLayout(new MigLayout("", "[30.00][224.00:224.00,grow][46.00][224.00:224.00,grow][30.00]", "[10.00][100.00][40.00][100.00][10.00][102.00,grow][10.00][][10.00]"));

		// panelMarca
		panelMarca = new JPanel();
		panelMarca.setBorder(new LineBorder(rojoOscuro, 3));
		panelMarca.setBackground(rojoOscuro);
		this.add(panelMarca, "cell 1 1,grow");
		panelMarca.setLayout(new BorderLayout(0, 0));

		// panelMarcaSup
		panelMarcaSup = new JPanel();
		panelMarcaSup.setBackground(rojoOscuro);
		panelMarca.add(panelMarcaSup, BorderLayout.NORTH);

		// panelMarcaCentro
		panelMarcaCentro = new JPanel();
		panelMarcaCentro.setBackground(rojoClaro);
		panelMarca.add(panelMarcaCentro, BorderLayout.CENTER);
		panelMarcaCentro.setLayout(new MigLayout("", "[grow]", "[45.00,grow]"));

		comboMarca = new JComboBox();
		cargarComboMarca();
		comboMarca.setPreferredSize(new Dimension(4, 30));
		comboMarca.setFont(new Font("Dialog", Font.PLAIN, 26));
		panelMarcaCentro.add(comboMarca, "cell 0 0,grow");

		// panelModelo
		panelModelo = new JPanel();
		panelModelo.setBorder(new LineBorder(rojoOscuro, 3));
		panelModelo.setBackground(rojoOscuro);
		this.add(panelModelo, "cell 3 1,grow");
		panelModelo.setLayout(new BorderLayout(0, 0));

		// panelModeloSup
		panelModeloSup = new JPanel();
		panelModeloSup.setBackground(rojoOscuro);
		panelModelo.add(panelModeloSup, BorderLayout.NORTH);

		// panelModeloCentro
		panelModeloCentro = new JPanel();
		panelModeloCentro.setBackground(rojoClaro);
		panelModelo.add(panelModeloCentro, BorderLayout.CENTER);
		panelModeloCentro
				.setLayout(new MigLayout("", "[grow]", "[45.00,grow]"));

		// comboModelo
		comboModelo = new JComboBox();
		comboModelo.setEnabled(false);
		comboModelo.setPreferredSize(new Dimension(4, 30));
		comboModelo.setFont(new Font("Dialog", Font.PLAIN, 26));
		panelModeloCentro.add(comboModelo, "cell 0 0,grow");

		// panelModelo
		panelCombus = new JPanel();
		panelCombus.setBorder(new LineBorder(rojoOscuro, 3));
		panelCombus.setBackground(rojoOscuro);
		this.add(panelCombus, "cell 1 3,grow");
		panelCombus.setLayout(new BorderLayout(0, 0));

		// panelModeloSup
		panelCombusSup = new JPanel();
		panelCombusSup.setBackground(rojoOscuro);
		panelCombus.add(panelCombusSup, BorderLayout.NORTH);

		// panelModeloCentro
		panelCombusCentro = new JPanel();
		panelCombusCentro.setBackground(rojoClaro);
		panelCombus.add(panelCombusCentro, BorderLayout.CENTER);
		panelCombusCentro
				.setLayout(new MigLayout("", "[grow]", "[45.00,grow]"));

		// comboCombus
		comboCombus = new JComboBox();
		comboCombus.setEnabled(false);
		comboCombus.setPreferredSize(new Dimension(4, 30));
		comboCombus.setFont(new Font("Dialog", Font.PLAIN, 26));
		panelCombusCentro.add(comboCombus, "cell 0 0,grow");

		// panelCV
		panelCV = new JPanel();
		panelCV.setBorder(new LineBorder(rojoOscuro, 3));
		panelCV.setBackground(rojoOscuro);
		this.add(panelCV, "cell 3 3,grow");
		panelCV.setLayout(new BorderLayout(0, 0));

		// panelCVSup
		panelCVSup = new JPanel();
		panelCVSup.setBackground(rojoOscuro);
		panelCV.add(panelCVSup, BorderLayout.NORTH);

		// panelCVCentro
		panelCVCentro = new JPanel();
		panelCVCentro.setBackground(rojoClaro);
		panelCV.add(panelCVCentro, BorderLayout.CENTER);
		panelCVCentro.setLayout(new MigLayout("", "[grow]", "[grow]"));
		
		scrollPaneTablaDescripcion = new JScrollPane();
		add(scrollPaneTablaDescripcion, "flowx,cell 1 5 3 1,grow");
		
		tablaDescripcion = new JTable();
		scrollPaneTablaDescripcion.setViewportView(tablaDescripcion);
		tablaDescripcion.setFont(new Font("Dialog",Font.PLAIN,20));
		tablaDescripcion.setRowHeight(28);

		botonVistaPrevia = new JButton("Vista previa");
		botonVistaPrevia.setFont(new Font("Dialog", Font.PLAIN, 20));
		this.add(botonVistaPrevia, "cell 1 7,alignx left,growy");

		// panelInfBotones
		panelInfBotones = new JPanel();
		this.add(panelInfBotones, "cell 3 7,alignx trailing,growy");
		panelInfBotones.setLayout(new BorderLayout(10, 0));

		// INSTANCIAR CAMPOS TEXTO
		// campoTiempo
		comboCV = new JComboBox();
		comboCV.setEnabled(false);
		comboCV.setPreferredSize(new Dimension(4, 30));
		comboCV.setFont(new Font("Dialog", Font.PLAIN, 26));
		panelCVCentro.add(comboCV, "flowx,cell 0 0,grow");

		// INSTANCIAR ETIQUETAS
		// labelMarca
		labelMarca = new JLabel("Marca");
		labelMarca.setFont(new Font("Dialog", Font.BOLD, 20));
		labelMarca.setForeground(new Color(255, 255, 255));
		panelMarcaSup.add(labelMarca);

		// labelModelo
		labelModelo = new JLabel("Modelo");
		labelModelo.setForeground(new Color(255, 255, 255));
		labelModelo.setFont(new Font("Dialog", Font.BOLD, 20));
		panelModeloSup.add(labelModelo);

		// labelModelo
		labelCombus = new JLabel("Combustible");
		labelCombus.setForeground(new Color(255, 255, 255));
		labelCombus.setFont(new Font("Dialog", Font.BOLD, 20));
		panelCombusSup.add(labelCombus);

		// labelTiempo
		labelCV = new JLabel("CV");
		labelCV.setForeground(new Color(255, 255, 255));
		labelCV.setFont(new Font("Dialog", Font.BOLD, 20));
		panelCVSup.add(labelCV);

		// INISTANCIAR BOTONES
		// botonPagar
		botonComprar = new JButton("Comprar");
		botonComprar.setFont(new Font("Dialog", Font.BOLD, 20));
		panelInfBotones.add(botonComprar, BorderLayout.EAST);
		
		// Llamada a los oyentes
		comboMarca.addItemListener(new oyenteComboMarca());
		comboModelo.addItemListener(new oyenteComboModelo());
		comboCombus.addItemListener(new oyenteComboCombus());
		comboCV.addItemListener(new oyenteComboCV());
		botonComprar.addActionListener(new oyenteBotones());
		botonVistaPrevia.addActionListener(new oyenteBotones());

	}

	public String cabeceraCombo(String tipo) {
		return "Seleccione " + tipo + "...";
	}
	
	public void resetearCombo(JComboBox combo){
		combo.removeAllItems();
		combo.setEnabled(false);
		combo.updateUI();
		tablaDescripcion.setModel(new DefaultTableModel());
		tablaDescripcion.repaint();
		tablaDescripcion.updateUI();
	}
		

	public void cargarComboMarca() {
		Vector v = control.listadoMarcas();
		//comboMarca = new JComboBox();
		//comboMarca.removeAllItems();
		//comboMarca.updateUI();
		//comboMarca.setEnabled(true);
		comboMarca.addItem(cabeceraCombo("marca"));
		for (int i = 0; i < v.size(); i++) {
			comboMarca.addItem(((String[]) v.get(i))[0]);
		}
	}

	public void cargarComboModelo(String marca) {
		Vector v = control.listadoModeloMarcas(marca);

		comboModelo.addItem(cabeceraCombo("modelo"));
		for (int i = 0; i < v.size(); i++) {
			comboModelo.addItem(((String[]) v.get(i))[0]);
		}
	}

	public void cargarComboCombus(String modelo) {
		Vector v = control.listadoCombustibles(modelo);

		comboCombus.addItem(cabeceraCombo("combustible"));
		for (int i = 0; i < v.size(); i++) {
			comboCombus.addItem(((String[]) v.get(i))[0]);
		}
	}
	
	public void cargarComboCV(String modelo, String combustible) {
		Vector v = control.listadoCV(modelo, combustible);

		comboCV.addItem(cabeceraCombo("cv"));
		for (int i = 0; i < v.size(); i++) {
			comboCV.addItem(((String[]) v.get(i))[0]);
		}
	}
	
	public void cargarTabla(String modelo, String combustible, int cv){
		DefaultTableModel tablaDesc = new DefaultTableModel();
		tablaDesc.addColumn("Descripcion");
		Vector v = control.listadoMotorizacion(modelo, combustible, cv);
		for (int i = 0; i<v.size(); i++){
			tablaDesc.addRow(((Object[]) v.get(i)));	
		}
		tablaDescripcion.setModel(tablaDesc);
	}
	

	// OYENTES
	class oyenteComboMarca implements ItemListener {
		public void itemStateChanged(ItemEvent ie) {
			if (ie.getStateChange() == ItemEvent.DESELECTED) {
				System.out.println(comboMarca.getSelectedItem().toString());
				if (!comboMarca.getSelectedItem().toString().equalsIgnoreCase(cabeceraCombo("marca"))) {
					// Antes de habilitar el comboModelo deshabilitamos el resto
					// de combos
					resetearCombo(comboCombus);
					resetearCombo(comboCV);
					// Habilitamos comboModelo
					comboModelo.setEnabled(true);
					comboModelo.removeAllItems();
					// Cargamos comboModelo
					cargarComboModelo(comboMarca.getSelectedItem().toString());
					comboModelo.updateUI();
				} else {
					// Deshabilitamos todos los combos excepto comboMarca
					resetearCombo(comboModelo);
					resetearCombo(comboCombus);
					resetearCombo(comboCV);
				}
			}
		}
	}

    class oyenteComboModelo implements ItemListener {
            public void itemStateChanged(ItemEvent ie) {
                    if (ie.getStateChange() == ItemEvent.DESELECTED && comboModelo.getSelectedItem()!=null) {
                            System.out.println(comboModelo.getSelectedItem().toString());
                            if (!comboModelo.getSelectedItem().toString().equalsIgnoreCase(cabeceraCombo("marca"))) {
                                    // Antes de habilitar el comboCombus deshabilitamos el resto de combos
                                    resetearCombo(comboCV);
                                    // Habilitamos comboCombus
                                    comboCombus.setEnabled(true);
                                    comboCombus.removeAllItems();
                                    // Cargamos comboCombus
                                    cargarComboCombus(comboModelo.getSelectedItem().toString());
                                    comboCombus.updateUI();
                            } else {
                                    comboCombus.removeAllItems();
                                    comboCombus.setEnabled(false);
                                    comboCombus.updateUI();
                            }
                    }
            }
    }

    class oyenteComboCombus implements ItemListener {
            public void itemStateChanged(ItemEvent ie) {
                    if (ie.getStateChange() == ItemEvent.DESELECTED && comboCombus.getSelectedItem()!=null) {
                            System.out.println(comboCombus.getSelectedItem().toString());
                            if (!comboCombus.getSelectedItem().toString().equalsIgnoreCase(cabeceraCombo("modelo"))) {
                                    // Habilitamos comboCV
                                    comboCV.setEnabled(true);
                                    comboCV.removeAllItems();
                                    // Cargamos comboCV
                                    cargarComboCV(comboModelo.getSelectedItem().toString(), comboCombus.getSelectedItem().toString());
                                    comboCV.updateUI();
                            } else {
                                    comboCV.removeAllItems();
                                    comboCV.setEnabled(false);
                                    comboCV.updateUI();
                            }
                    }
            }
    }
    
	class oyenteComboCV implements ItemListener {
		public void itemStateChanged(ItemEvent ie) {
			if (ie.getStateChange() == ItemEvent.DESELECTED
					&& comboCombus.getSelectedItem() != null) {
				System.out.println(comboCombus.getSelectedItem().toString());
				if (!comboCombus.getSelectedItem().toString()
						.equalsIgnoreCase(cabeceraCombo("cv"))) {
					// Cargamos la tabla
					cargarTabla(comboModelo.getSelectedItem().toString(),
							comboCombus.getSelectedItem().toString(),
							Integer.parseInt(comboCV.getSelectedItem()
									.toString()));
				}
			}
		}
	}

	
	class oyenteBotones implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equalsIgnoreCase("comprar")) {
				System.out.println("Mostrar informe de compra.");
			} else if (e.getActionCommand().equalsIgnoreCase("vista previa")) {
				dialogImagen = new Dialogo_Imagen(control);
				dialogImagen.setVisible(true);
			}
		}
	}

	// GETTER & SETTER
	/**
	 * @return the comboCV
	 */
	public JComboBox getComboCV() {
		return comboCV;
	}

	/**
	 * @param comboCV
	 *            the comboCV to set
	 */
	public void setComboCV(JComboBox comboCV) {
		this.comboCV = comboCV;
	}

	/**
	 * @return the comboMarca
	 */
	public JComboBox getComboMarca() {
		return comboMarca;
	}

	/**
	 * @param comboMarca
	 *            the comboMarca to set
	 */
	public void setComboMarca(JComboBox comboMarca) {
		this.comboMarca = comboMarca;
	}

	/**
	 * @return the comboModelo
	 */
	public JComboBox getComboModelo() {
		return comboModelo;
	}

	/**
	 * @param comboModelo
	 *            the comboModelo to set
	 */
	public void setComboModelo(JComboBox comboModelo) {
		this.comboModelo = comboModelo;
	}

	/**
	 * @return the comboCombus
	 */
	public JComboBox getComboCombus() {
		return comboCombus;
	}

	/**
	 * @param comboCombus
	 *            the comboCombus to set
	 */
	public void setComboCombus(JComboBox comboCombus) {
		this.comboCombus = comboCombus;
	}

}
